package com.tjetc.myservlet;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Objects;

/**
 * 接收请求并创建线程
 *
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/9/1
 */
@SuppressWarnings("all")
public class MyRequestHandler implements Runnable {

    // 要处理的每一个请求对象
    private Socket socket;

    public MyRequestHandler(Socket socket) {
        this.socket = socket;
    }

    // 更改为线程版本
    /*
    @Override
    public void run() {
        System.out.println("-------------使用线程提高并发----------------");
        try {
            InputStream inputStream = socket.getInputStream();
            // 包装成字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));


            // 接收一下当前线程信息
            System.out.println("当前线程：" + Thread.currentThread().getName());


            String data = "";
            System.out.println("------------开始接收请求数据--------------");
            // 循环读取
            while ((data = bufferedReader.readLine()) != null) {
                // 结束读？
                if (data.length() == 0) {
                    break;
                }
//                System.out.println(data);
            }


            OutputStream outputStream = socket.getOutputStream();
            String respHeader = """
                    HTTP/1.1 200 OK
                    Content-Type: text/html;charset=utf-8
                    
                    """;
            String respMsg = respHeader + "张三";

            // 将数据写会给浏览器
            outputStream.write(respMsg.getBytes());

            socket.close();


        } catch (Exception e) {

        } finally {
            // 简化操作 socket
        }

    }
    */


    /*
    // 将请求和响应全部分解出来 交给请求对象和响应对象完成
    @Override
    public void run() {
        System.out.println("-------------简化请求和响应----------------");
        try {
            // 处理请求
            MyHttpRequest myHttpRequest = new MyHttpRequest(socket.getInputStream());
            int num1 = Integer.parseInt(myHttpRequest.getParameter("num1"));
            int num2 = Integer.parseInt(myHttpRequest.getParameter("num2"));

            int result = num1 + num2;

           // 处理响应
            MyHttpResponse myHttpResponse = new MyHttpResponse(socket.getOutputStream());
            String respMsg = MyHttpResponse.respHeader + result;

            OutputStream outputStream = myHttpResponse.getOutputStream();
            outputStream.write(respMsg.getBytes());
            socket.close();


        } catch (Exception e) {

        } finally {
            // 简化操作 socket
        }

    }
    */


    /*
    @Override
    public void run() {
        try {
            System.out.println("-------------添加Servlet----------------");
            // 处理请求
            MyHttpRequest myHttpRequest = new MyHttpRequest(socket.getInputStream());

            // 处理响应
            MyHttpResponse myHttpResponse = new MyHttpResponse(socket.getOutputStream());


            CalculateServlet calculateServlet = new CalculateServlet();
            calculateServlet.doGet(myHttpRequest, myHttpResponse);

            socket.close();


        } catch (Exception e) {

        } finally {
            // 简化操作 socket
        }

    }

     */


    @Override
    public void run() {
        try {
            System.out.println("-------------根据对应的路径进行请求Servlet----------------");
            // 处理请求
            MyHttpRequest myHttpRequest = new MyHttpRequest(socket.getInputStream());
            System.out.println(myHttpRequest);
            // 处理响应
            MyHttpResponse myHttpResponse = new MyHttpResponse(socket.getOutputStream());
            System.out.println(myHttpResponse);

            // 先拿到请求路径去Map中查找
            String requestUri = myHttpRequest.getUri();
            String servletName = _3MyTomcat.SERVLET_URL_MAP.get(requestUri);

            // 在根据对应的Servlet实例找到对应的Servlet
            MyHttpServlet myHttpServlet = _3MyTomcat.SERVLET_NAME_MAP.get(servletName);


            /*
                如果此时有Filter机制先走过滤器 才能调用真正的Servlet
                1. 根据请求的地址去过滤器中查找
                2. 如果匹配到了 说明就需要被拦截 （在这就可以自己编写过滤器机制）
                3. 如果没有匹配到，直接放行 访问对应的资源

             */
            if (Objects.nonNull(myHttpServlet)) {
                // 动态绑定机制 他会调用你自己写的Servlet的doGet或者doPost方法
                myHttpServlet.service(myHttpRequest, myHttpResponse);
            }else {
                // 如果找不到Servlet 就会返回一个404
                // 省略不写
            }

            socket.close();


        } catch (Exception e) {

        } finally {
            // 简化操作 socket
        }

    }
}